package net.gd.utils;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;

import org.apache.commons.httpclient.util.DateUtil;
import org.apache.log4j.Logger;

import net.gd.servlet.PermissionServlet;
import net.sf.json.JSONObject;

/** 
 * @author Uriel 
 * @date 2018年1月28日 下午6:28:21 
 * @version 1.0 
*/
public class ZepplinUtils {
	private static String encoding;
//	private static final String baseURL = ApplicationConf.getProperty("zepplin.url");
	private static final String baseURL = "http://atomtree001:8099/api/";
    private static String date = DateUtils.getDateTimeNow();
    private static Logger logger = Logger.getLogger(PermissionServlet.class);
	
    /**
     * @description 获得已认证的插件
     * @author Uriel
     * @date 2018年1月28日 下午6:56:33
     * @version V3.0
     * @return String
     */
	public String listInterpreter(){
		logger.info("获得已支持的插件===>>>");
		System.out.println(date + " Info 获得已支持的插件===>>>");
        String method = "GET";
        String para = "interpreter";
        return  excute(para,method,null);
	}
	
	/**
	 * @description 获得已配置插件的基础信息
	 * @author Uriel
	 * @date 2018年1月28日 下午7:09:03
	 * @version V3.0
	 * @return String
	 */
	public String interpreterInfo(){
		logger.info("获得已配置插件的基础信息===>>>");
		System.out.println(date + " Info 获得已配置插件的基础信息===>>>");
        String method = "GET";
        String para = "interpreter/setting";
        return  excute(para,method,null);
	}
	
	/**
	 * @description 获得已配置插件的基础信息
	 * @author Uriel
	 * @date 2018年1月28日 下午7:11:13
	 * @version V3.0
	 * @param id
	 * @return String
	 */
	public String getSingleInterpreter(String id){
		logger.info("获得已配置插件的基础信息===>>>");
		System.out.println(date + " Info 获得已配置插件的基础信息===>>>");
        String method = "GET";
        String para = "interpreter/setting/"+id;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 获得所有在zepplin中注册的模型列表
	 * @author Uriel
	 * @date 2018年1月28日 下午7:13:24
	 * @version V3.0
	 * @return String
	 */
	public String listNoteBookName(String noteName){
		logger.info("获得所有在zepplin中注册的模型列表===>>>>");
		System.out.println(date + " Info 获得所有在zepplin中注册的模型列表===>>>");
        String method = "POST";
        String para = "notebook";
        return  excute(para,method,null);
	}
	
	/**
	 * @description 创建没有初始内容的notebook
	 * @author Uriel
	 * @date 2018年1月28日 下午7:16:27
	 * @version V3.0
	 * @return
	 */
	public static String createNoteBook(JSONObject noteName){
		logger.info("获得所有在zepplin中注册的模型列表===>>>>");
		System.out.println(date + " Info 获得所有在zepplin中注册的模型列表===>>>");
        String method = "POST";
        String para = "notebook";
//        encoding = noteName.toString();
//        byte[] data = (noteName.toString()).getBytes();
        return  excute(para,method,noteName.toString());
	}
	
	public static void main(String[] args) {
		JSONObject noteName = new JSONObject();
		noteName.put("name", "test");
//		String note = "{\"name\": \"name of new note\"}";
		createNoteBook(noteName);
	}
	
	/**
	 * @description 获得note下的执行信息 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:19:47
	 * @version V3.0
	 * @param noteId
	 * @return String
	 */
	public String getAllParagraphs(String noteId){
		logger.info("获得note下的执行信息===>>>>");
		System.out.println(date + " Info 获得note下的执行信息===>>>");
        String method = "GET";
        String para = "notebook/job/"+noteId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 创建paragraph
	 * @author Uriel
	 * @date 2018年1月28日 下午7:28:40
	 * @version V3.0
	 * @param noteId
	 * @return
	 */
	public String createParagraph(String noteId){
		logger.info("创建paragraph===>>>>");
		System.out.println(date + " Info 创建paragraph===>>>");
        String method = "GET";
        String para = "notebook/job/"+noteId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 获得段落内容及信息 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:30:50
	 * @version V3.0
	 * @param noteId
	 * @param paragraphId
	 * @return
	 */
	public String getParagraphInfo(String noteId, String paragraphId){
		logger.info("获得段落内容及信息===>>>>");
		System.out.println(date + " Info 获得段落内容及信息===>>>");
        String method = "GET";
        String para = "notebook/job/"+noteId +"/paragraph/"+paragraphId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 获得单个paragraph的状态 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:32:10
	 * @version V3.0
	 * @param noteId
	 * @param paragraphId
	 * @return String
	 */
	public String getParagraphStatus(String noteId, String paragraphId){
		logger.info("获得单个paragraph的状态===>>>>");
		System.out.println(date + " Info 获得单个paragraph的状态===>>>");
        String method = "GET";
        String para = "notebook/job/"+noteId +"/"+paragraphId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 删除paragraph 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:35:08
	 * @version V3.0
	 * @param noteId
	 * @param paragraphId
	 * @return
	 */
	public String deleteParagraph(String noteId, String paragraphId){
		logger.info("删除paragraph===>>>>");
		System.out.println(date + " Info 删除paragraph===>>>");
        String method = "DELETE";
        String para = "notebook/"+noteId +"/paragraph/"+paragraphId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 执行paragraph 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:43:59
	 * @version V3.0
	 * @param noteId
	 * @param paragraphId
	 * @return
	 */
	public String runParagraph(String noteId, String paragraphId){
		logger.info("执行paragraph===>>>>");
		System.out.println(date + " Info 执行paragraph===>>>");
        String method = "POST";
        String para = "notebook/run/"+noteId +"/"+paragraphId;
        return  excute(para,method,null);
	}
	
	/**
	 * @description 停止执行段落 
	 * @author Uriel
	 * @date 2018年1月28日 下午7:50:14
	 * @version V3.0
	 * @param noteId
	 * @param paragraphId
	 * @return
	 */
	public String stopParagraph(String noteId, String paragraphId){
		logger.info("停止paragraph===>>>>");
		System.out.println(date + " Info 停止paragraph===>>>");
        String method = "DELETE";
        String para = "notebook/job/"+noteId +"/"+paragraphId;
        return  excute(para,method,null);
	}
	
	/**
     * 执行
     * @param para
     * @param method
     * @param body 
     * @return String
     */
    private  static String excute(String para,String method,String body){

//        StringBuilder out = new StringBuilder();
        try {
            URL url = new URL(baseURL+para);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            
            byte[] data = body.getBytes();
            connection.setRequestProperty("Content-Length", String.valueOf(data.length));
            connection.setRequestProperty("Content-Type","application/json");
         // 开始连接请求
            connection.connect();
            OutputStream  out = connection.getOutputStream();     
            // 写入请求的字符串
            out.write(data);
            out.flush();
            out.close();
            int status = connection.getResponseCode();
            connection.disconnect();

        } catch(Exception e) {
        	logger.error("zepplin 执行出错!");
            e.printStackTrace();
        }
        return null;
    }
}
